package com.example.d2_recursion;

/**
 * 目标：掌握递归的应用,执行流程和算法思想
 */
public class RecursionTest2 {
    public static void main(String[] args) {
        System.out.println("5的阶乘是：" + f(5));
        System.out.println("1-5的和是：" + f1(5));
    }

    /**
     * 递归求1-n的和
     * <p>
     * 该方法使用递归的方式计算从1到n的所有整数的和
     * 它基于一个简单的数学原理：n的和等于n-1的和加上n本身,以此类推,直到n为1时,直接返回1
     * 这种方法展示了递归的优雅,但需要注意的是,对于大数值的n,可能会导致栈溢出错误
     *
     * @param n 待求和的上限,必须是正整数
     * @return 从1到n的整数和
     */
    private static int f1(int n) {
        // 递归终止条件：当n为1时,直接返回1
        if (n == 1) {
            return 1;
        } else {
            // 递归调用：计算n-1的和加上n的和
            return f(n - 1) + f(n);
        }
    }

    /**
     * 递归求阶乘
     *
     * @param n 待求阶乘的整数
     * @return n的阶乘结果
     */
    public static int f(int n) {
        // 当n为1时,递归结束,返回1,这是递归的终止条件
        if (n == 1) {
            return 1;
        } else {
            // 递归调用,计算n的阶乘,n的阶乘是n-1的阶乘乘以n
            return f(n - 1) * n;
        }
    }
}
